﻿/***********************************************************************
 * 描述:     测试table的控件
 * File:    tablewidget.h
 * Author:  gaomaolong@mozihealthcare.cn
 * Date:    25-10-16 上午10:06
 * Version: 1.0
 * Update:  Initial version
 *
 * Copyright 2025 All rights reserved.
 **********************************************************************/
#ifndef TABLEWIDGET_H
#define TABLEWIDGET_H

#include "control_sample/qtpropertybrowser/qtpropertybrowser.h"


#include <QWidget>
#include <QtWidgets>
#include <variant>


class QtProperty;
QT_BEGIN_NAMESPACE
namespace Ui
{
	class TableWidget;
}
QT_END_NAMESPACE

class TableWidget : public QWidget
{
	Q_OBJECT

public:
	explicit TableWidget(QWidget* parent = nullptr);
	~TableWidget() override;
private slots:
	/**
	 * 属性变化时，发出对应的信号
	 * @param property 变化的属性
	 * @param value 变化的值
	 */
	void onIntPropertyChanged(QtProperty* property, int value);
	void onBoolPropertyChanged(QtProperty* property, bool value);
	void onEnumPropertyChanged(QtProperty* property, int value);
	void onColorPropertyChanged(QtProperty* property, const QColor& value);
	void onFontPropertyChanged(QtProperty* property, const QFont& value);
	void onStringPropertyChanged(QtProperty* property, const QString& value);
	void onDoublePropertyChanged(QtProperty* property, double value);

	//==========操作按钮点击槽================
	// void onAddRowClicked();


private:
	void _init();
	void initStyle();
	void initDefaultTable();
	void initPropertySystem();

	/**
	 * @brief 注册属性名称以及对应的回调函数
	 * 该函数将属性名称与对应的回调函数绑定。当属性值发生变化时，
	 * 系统会调用对应的回调函数，并传入属性的新值（类型为 T）。
	 *
	 * @tparam T 属性值的类型，例如 int、bool、QColor、QFont 等
	 * @tparam F 回调函数类型，可以是 lambda、函数指针或可调用对象
	 * @param name 属性名称，用于在属性值变化时查找对应的回调
	 * @param func 回调函数，当属性值变化时会被调用，参数类型为 T
	 */
	template<typename T, typename F>
	void registerPropertyHandler(const QString& name, F&& func);

	/**
	 * 添加并选中最后一行文本
	 * @param text 添加的日志文本
	 */
	void appendLogAndSelect(const QString& text);

	/**
	 * 处理属性变化
	 * @param property 属性
	 * @param valueStr 属性值
	 */
	void handlePropertyChanged(QtProperty* property, const QString& valueStr);

private:
	Ui::TableWidget* ui;

	// 用来存储属性变化时对应的回调函数
	QMap<QString, std::function<void(const QVariant&)>> m_propertyHandlers;
};

template<typename T, typename F>
void TableWidget::registerPropertyHandler(const QString& name, F&& func)
{
	m_propertyHandlers[name] = [f = std::forward<F>(func)](const QVariant& v) {
		if constexpr (std::is_same_v<T, QColor>)
			f(v.value<QColor>());
		else if constexpr (std::is_same_v<T, QFont>)
			f(v.value<QFont>());
		else
			f(v.value<T>());
	};
}


#endif//TABLEWIDGET_H
